Hibernate ক্যাশিং এমন একটি পদ্ধতি, যা ডাটাবেসে বারবার একই ডেটা রিকোয়েস্ট করা এড়িয়ে পারফরম্যান্স উন্নত করে। Hibernate দুই স্তরের ক্যাশিং মেকানিজম প্রদান করে: First Level Cache এবং Second Level Cache।
First Level Cache
সংজ্ঞা
First Level Cache Hibernate এর ডিফল্ট ক্যাশিং স্তর, যা প্রতিটি Session এর সঙ্গে সম্পর্কিত। এটি শুধুমাত্র সেশন স্কোপের মধ্যে কাজ করে এবং স্বয়ংক্রিয়ভাবে অ্যাপ্লিকেশনে অন্তর্ভুক্ত থাকে।
বৈশিষ্ট্য
- সেশন-স্কোপড: একটি নির্দিষ্ট সেশন পর্যন্ত কার্যকর।
- ডিফল্টভাবে সক্রিয়: কোনো কনফিগারেশন প্রয়োজন হয় না।
- প্রতিটি সেশনের জন্য আলাদা ক্যাশ থাকে।
উদাহরণ
Session session = sessionFactory.openSession();
session.beginTransaction();
// প্রথমবার অবজেক্ট ফেচ করবে ডাটাবেস থেকে
Employee employee1 = session.get(Employee.class, 1L);
System.out.println(employee1.getName());
// দ্বিতীয়বার একই অবজেক্ট সেশন ক্যাশ থেকে ফেচ হবে
Employee employee2 = session.get(Employee.class, 1L);
System.out.println(employee2.getName());
session.getTransaction().commit();
session.close();
কার্যপ্রক্রিয়া
- যখন কোনো Entity প্রথমবার ফেচ করা হয়, তখন সেটি সেশন ক্যাশে জমা হয়।
- একই সেশনের মধ্যে আবার সেই Entity ফেচ করলে ডাটাবেসের পরিবর্তে ক্যাশ থেকে ডেটা রিটার্ন করা হয়।
Second Level Cache
সংজ্ঞা
Second Level Cache Hibernate এর একটি ঐচ্ছিক ক্যাশিং স্তর, যা সেশন ফ্যাক্টরি-স্কোপড। এটি একাধিক সেশনের মধ্যে ডেটা শেয়ার করতে পারে এবং পারফরম্যান্স আরও উন্নত করে।
বৈশিষ্ট্য
- সেশন ফ্যাক্টরি-স্কোপড: একাধিক সেশনের জন্য কার্যকর।
- কনফিগারেশন প্রয়োজন।
- বাইরের ক্যাশিং ফ্রেমওয়ার্ক যেমন EhCache, Redis, বা Infinispan ব্যবহার করা হয়।
কনফিগারেশন
Hibernate Second Level Cache ব্যবহার করতে নিম্নলিখিত ধাপগুলো অনুসরণ করতে হয়:
১. ডিপেন্ডেন্সি সংযুক্তি
pom.xml ফাইলে EhCache এর জন্য ডিপেন্ডেন্সি যোগ করুন:
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>6.2.6.Final</version>
</dependency>
২. Hibernate কনফিগারেশন
application.properties এ Second Level Cache সক্রিয় করতে হবে:
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.jcache.JCacheRegionFactory
spring.jpa.properties.javax.cache.provider=org.ehcache.jsr107.EhcacheCachingProvider
৩. Entity ক্লাসে ক্যাশিং সক্রিয় করা
Entity ক্লাসে @Cache এনোটেশন ব্যবহার করুন:
import jakarta.persistence.*;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// Getters and Setters
}
পার্থক্য: First Level এবং Second Level Cache
| বৈশিষ্ট্য | First Level Cache | Second Level Cache |
|---|---|---|
| স্কোপ | সেশন-স্কোপড | সেশন ফ্যাক্টরি-স্কোপড |
| ডিফল্ট স্টেট | ডিফল্টভাবে সক্রিয় | কনফিগারেশন প্রয়োজন |
| ডেটা শেয়ারিং | একক সেশনের মধ্যে সীমাবদ্ধ | একাধিক সেশনের মধ্যে ডেটা শেয়ার |
| কাস্টমাইজেশন | কাস্টমাইজেশন সম্ভব নয় | বিভিন্ন ক্যাশিং ফ্রেমওয়ার্ক ব্যবহৃত |
| পারফরম্যান্স | সেশনভিত্তিক ডেটা ফেচ উন্নত করে | ডাটাবেস লোড কমিয়ে পারফরম্যান্স উন্নত করে |
উদাহরণ প্রজেক্টে Cache এর ব্যবহার
১. Service লেয়ারে ক্যাশ টেস্ট করা
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class EmployeeService {
@Autowired
private EmployeeRepository employeeRepository;
public Employee getEmployeeById(Long id) {
// প্রথমবার ডেটা ডাটাবেস থেকে আনবে
return employeeRepository.findById(id).orElseThrow(() -> new RuntimeException("Employee not found"));
}
public Employee getEmployeeFromCache(Long id) {
// দ্বিতীয়বার ডেটা ক্যাশ থেকে আনবে (Second Level Cache)
return employeeRepository.findById(id).orElseThrow(() -> new RuntimeException("Employee not found"));
}
}
২. Controller থেকে ক্যাশিং পরীক্ষা
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/employees")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
@GetMapping("/{id}")
public Employee getEmployee(@PathVariable Long id) {
return employeeService.getEmployeeById(id);
}
@GetMapping("/cache/{id}")
public Employee getEmployeeFromCache(@PathVariable Long id) {
return employeeService.getEmployeeFromCache(id);
}
}
সারাংশ
Hibernate ক্যাশিং সিস্টেম অ্যাপ্লিকেশনের ডেটাবেস কার্যকারিতা উন্নত করতে গুরুত্বপূর্ণ ভূমিকা পালন করে। First Level Cache সেশনভিত্তিক এবং ডিফল্টভাবে সক্রিয়, যেখানে Second Level Cache একাধিক সেশনের মধ্যে ডেটা শেয়ার করতে পারে এবং কনফিগারেশন প্রয়োজন। Second Level Cache ব্যবহার করে ডেটাবেস লোড উল্লেখযোগ্যভাবে কমানো যায় এবং অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করা যায়।
Caching হলো এমন একটি প্রক্রিয়া যেখানে ডেটা বা অবজেক্টকে ডাটাবেস থেকে পুনরায় লোড করার পরিবর্তে মেমোরিতে রাখা হয়। এটি অ্যাপ্লিকেশন পারফরম্যান্স বাড়াতে এবং ডাটাবেসের লোড কমাতে সাহায্য করে। Hibernate-এ, ক্যাশিং একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা ডেটাবেসে বারবার কুয়েরি চালানোর পরিবর্তে ডেটা দ্রুত সরবরাহ করতে সহায়তা করে।
Caching এর মূল ধারণা
Caching সিস্টেম সাধারণত অ্যাপ্লিকেশন এবং ডাটাবেসের মধ্যে একটি মধ্যস্থ লেয়ার হিসেবে কাজ করে। এটি ডেটা সংরক্ষণ করে এবং প্রয়োজন অনুযায়ী তা পুনরায় ব্যবহারযোগ্য করে তোলে।
প্রয়োজনীয়তা
- ডাটাবেস কুয়েরির সংখ্যা কমানো।
- ডাটাবেস অ্যাক্সেসের জন্য সময় হ্রাস করা।
- অ্যাপ্লিকেশন পারফরম্যান্স উন্নত করা।
Hibernate-এ Caching এর ধরণ
Hibernate-এ দুটি ক্যাশিং লেভেল রয়েছে:
১. First Level Cache (প্রথম স্তরের ক্যাশিং)
- Hibernate-এর ডিফল্ট ক্যাশিং।
Session-এর সাথে যুক্ত।- প্রতিটি Hibernate
Session-এর নিজস্ব আলাদা ক্যাশ রয়েছে। - একই
Sessionএর মধ্যে পুনরায় ডেটা রিট্রিভ করার সময় ডেটাবেস কুয়েরি না করে মেমোরি থেকে ডেটা প্রদান করে।
উদাহরণ:
Session session = sessionFactory.openSession();
Product product1 = session.get(Product.class, 1L); // ডাটাবেস থেকে লোড
Product product2 = session.get(Product.class, 1L); // ক্যাশ থেকে লোড
২. Second Level Cache (দ্বিতীয় স্তরের ক্যাশিং)
- ডিফল্টভাবে সক্রিয় নয়; এটি কনফিগার করতে হয়।
SessionFactory-এর সাথে যুক্ত।- ভিন্ন
Sessionএর মধ্যে ডেটা শেয়ার করা যায়। - প্রায়ই বড় ডাটাসেটের জন্য ব্যবহৃত হয়।
ক্যাশিং সরঞ্জাম: Hibernate Second Level Cache বাস্তবায়নের জন্য নিচের ক্যাশিং লাইব্রেরি ব্যবহার করা যেতে পারে:
- EhCache
- Hazelcast
- Infinispan
- Caffeine
Hibernate-এ Caching এর সেটআপ
First Level Cache
Hibernate-এ First Level Cache ডিফল্টভাবে সক্রিয় থাকে এবং এর জন্য কোনো অতিরিক্ত কনফিগারেশন প্রয়োজন হয় না।
Second Level Cache সেটআপ (EhCache উদাহরণ)
১. Maven ডিপেনডেন্সি যোগ করা
pom.xml ফাইলে Second Level Cache এর জন্য EhCache ডিপেনডেন্সি যোগ করুন:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>5.6.5.Final</version>
</dependency>
২. Hibernate কনফিগারেশন
application.properties বা application.yml ফাইলে Second Level Cache সক্রিয় করতে নিম্নলিখিত সেটিংস যুক্ত করুন:
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory
spring.jpa.properties.hibernate.cache.use_query_cache=true
৩. Entity-তে ক্যাশিং সক্রিয় করা
ক্যাশিং সক্রিয় করতে Entity ক্লাসে @Cache অ্যানোটেশন ব্যবহার করুন:
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Product {
@Id
private Long id;
private String name;
private Double price;
// Getters and Setters
}
Caching এর সুবিধা
- পারফরম্যান্স বৃদ্ধি:
ক্যাশিং সরাসরি মেমোরি থেকে ডেটা সরবরাহ করে, যা ডাটাবেস অ্যাক্সেসের সময় কমায়। - ডাটাবেস লোড কমানো:
ক্যাশ ব্যবহারে ডাটাবেসে বারবার একই ডেটা কুয়েরি করার প্রয়োজন হয় না। - অ্যাপ্লিকেশন রেসপন্স টাইম কমানো:
ডেটা দ্রুত রিট্রিভ হওয়ায় অ্যাপ্লিকেশনের রেসপন্স টাইম উন্নত হয়। - নেটওয়ার্ক ট্রাফিক কমানো:
ডাটাবেস সার্ভার এবং অ্যাপ্লিকেশন সার্ভারের মধ্যে ট্রাফিক কম হয়।
Caching ব্যবহারের সময় সতর্কতা
- Outdated ডেটা:
ক্যাশিং ব্যবহারে নিশ্চিত করতে হবে যে ডেটা আপডেটেড আছে। প্রয়োজন হলে ক্যাশ ইনভ্যালিডেট করার ব্যবস্থা রাখতে হবে। - Memory Management:
বড় ডেটাসেট ক্যাশে সংরক্ষণ করার সময় মেমোরি ব্যবস্থাপনার দিকে নজর রাখতে হবে। - Concurrency Control:
ক্যাশ ব্যবহারে সঠিক কনকারেন্সি কৌশল নির্ধারণ করা জরুরি, যেমন:READ_WRITE,NONSTRICT_READ_WRITE, ইত্যাদি।
Hibernate-এর Caching অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করার একটি গুরুত্বপূর্ণ কৌশল। First Level Cache স্বয়ংক্রিয় হলেও Second Level Cache কনফিগার করে বড় ডেটাসেট এবং জটিল অ্যাপ্লিকেশনগুলোর জন্য আরও কার্যকর সমাধান পাওয়া যায়।
Hibernate, Spring Boot ORM এর ডিফল্ট ইমপ্লিমেন্টেশন হিসেবে, Caching সিস্টেম ব্যবহার করে ডেটাবেস অপারেশনের পারফরম্যান্স উন্নত করে। Hibernate-এ দুটি স্তরের ক্যাশিং রয়েছে: First Level Cache এবং Second Level Cache। এগুলো ডেটাবেসে বারবার রিকোয়েস্ট পাঠানো থেকে বিরত রাখে এবং অ্যাপ্লিকেশনকে দ্রুততর করে।
First Level Cache
First Level Cache Hibernate-এর ডিফল্ট ক্যাশিং মেকানিজম এবং প্রতিটি Session-এর সাথে যুক্ত থাকে। এটি স্বয়ংক্রিয়ভাবে কাজ করে এবং ডেভেলপারের জন্য কোনো অতিরিক্ত কনফিগারেশন প্রয়োজন হয় না।
বৈশিষ্ট্য:
- সেশন নির্ভর: এটি শুধুমাত্র একটি Hibernate Session-এর মধ্যে কার্যকর থাকে।
- ডিফল্টভাবে সক্রিয়: আলাদাভাবে কনফিগার করার প্রয়োজন নেই।
- লিমিটেড স্কোপ: সেশন বন্ধ হওয়ার সাথে সাথে ক্যাশ মুছে যায়।
- অবজেক্ট ইডেন্টিটি গ্যারান্টি: একই সেশনের মধ্যে একই অবজেক্টের জন্য একাধিক কপি তৈরি হয় না।
উদাহরণ:
Session session = sessionFactory.openSession();
Product product1 = session.get(Product.class, 1L); // প্রথমবার ডেটাবেস থেকে ডেটা ফেচ করবে।
Product product2 = session.get(Product.class, 1L); // দ্বিতীয়বার ক্যাশ থেকে ডেটা ফেচ করবে।
session.close();
Second Level Cache
Second Level Cache সেশন-পরিসীমার বাইরে কাজ করে এবং SessionFactory-এর সাথে যুক্ত থাকে। এটি ক্যাশিংয়ের জন্য দীর্ঘমেয়াদি সমাধান এবং ডেটা বিভিন্ন সেশনের মধ্যে শেয়ার করতে পারে।
বৈশিষ্ট্য:
- SessionFactory নির্ভর: এটি সমস্ত সেশন জুড়ে কার্যকর থাকে।
- কনফিগারেশন প্রয়োজন: Second Level Cache সক্রিয় করতে আলাদাভাবে কনফিগার করতে হয়।
- পারফরম্যান্স উন্নত: ডেটাবেস থেকে পুনঃবার বার ডেটা রিট্রিভ করার প্রয়োজন কমায়।
- ক্যাশিং প্রোভাইডার: Hibernate Ehcache, Infinispan, OSCache ইত্যাদি ক্যাশিং প্রোভাইডার ব্যবহার করে।
উদাহরণ:
১. ডিপেনডেন্সি যোগ করা:
pom.xml-এ Hibernate Ehcache এর ডিপেনডেন্সি যোগ করুন।
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>5.6.7.Final</version>
</dependency>
২. Hibernate কনফিগারেশন:
application.properties ফাইলে Second Level Cache সক্রিয় করুন।
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.jcache.JCacheRegionFactory
spring.jpa.properties.javax.cache.provider=org.ehcache.jsr107.EhcacheCachingProvider
৩. Entity ক্লাসে ক্যাশিং এনোটেশন যোগ:
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Product {
@Id
private Long id;
private String name;
private Double price;
// Getters and Setters
}
ব্যবহার:
Session session1 = sessionFactory.openSession();
Product product1 = session1.get(Product.class, 1L); // প্রথমবার ডেটাবেস থেকে ফেচ হবে।
session1.close();
Session session2 = sessionFactory.openSession();
Product product2 = session2.get(Product.class, 1L); // দ্বিতীয়বার Second Level Cache থেকে ফেচ হবে।
session2.close();
First Level এবং Second Level Cache এর পার্থক্য
| বৈশিষ্ট্য | First Level Cache | Second Level Cache |
|---|---|---|
| ক্যাশ স্কোপ | শুধুমাত্র একটি সেশনের মধ্যে সীমাবদ্ধ। | সমস্ত সেশন জুড়ে কার্যকর। |
| ডিফল্ট সক্রিয়তা | Hibernate-এ ডিফল্টভাবে সক্রিয়। | ডেভেলপারদের সক্রিয় করতে হয়। |
| অবস্থান | Session এর সাথে যুক্ত। | SessionFactory এর সাথে যুক্ত। |
| ডেটা শেয়ারিং | সেশনগুলোর মধ্যে ডেটা শেয়ার হয় না। | সমস্ত সেশন ডেটা শেয়ার করতে পারে। |
| কনফিগারেশন প্রয়োজন | কনফিগারেশন ছাড়াই কাজ করে। | ক্যাশিং প্রোভাইডার এবং সেটআপ প্রয়োজন। |
| ব্যবহার ক্ষেত্র | ছোট ডেটা স্টোরেজ বা ট্রানজিয়েন্ট ডেটার জন্য। | বড় ডেটা বা দীর্ঘমেয়াদি ক্যাশিংয়ের জন্য। |
সারাংশ
Hibernate-এর First Level Cache এবং Second Level Cache ডেটাবেস অপারেশনের কার্যকারিতা উন্নত করে। First Level Cache সেশনের মধ্যে ডেটা সংরক্ষণ করে দ্রুত অ্যাক্সেস নিশ্চিত করে, যেখানে Second Level Cache সেশনের বাইরের জন্য ডেটা ক্যাশ করে দীর্ঘমেয়াদি পারফরম্যান্স উন্নত করে। অ্যাপ্লিকেশনের প্রয়োজন অনুসারে এই দুই ক্যাশিং পদ্ধতির ব্যবহার নির্ধারণ করা উচিত।
Hibernate-এ ক্যাশিং একটি গুরুত্বপূর্ণ কৌশল যা ডেটাবেজ অ্যাক্সেস কমিয়ে পারফরম্যান্স বৃদ্ধি করে। Hibernate দুটি স্তরের ক্যাশিং প্রদান করে:
- প্রথম স্তরের ক্যাশ (First-Level Cache): Hibernate নিজেই এটি পরিচালনা করে, যা ডিফল্টভাবে সক্রিয় থাকে।
- দ্বিতীয় স্তরের ক্যাশ (Second-Level Cache): এটি একটি ঐচ্ছিক ক্যাশিং স্তর, যা কাস্টম ক্যাশিং ফ্রেমওয়ার্কের মাধ্যমে পরিচালিত হয়, যেমন EhCache এবং Hazelcast।
Hibernate-এ EhCache Integration
EhCache হলো একটি উচ্চ পারফরম্যান্স, ওপেন-সোর্স ক্যাশিং সল্যুশন যা Hibernate-এর দ্বিতীয় স্তরের ক্যাশিং পরিচালনার জন্য ব্যবহার করা হয়।
১. Maven ডিপেনডেন্সি যুক্ত করা
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>5.x.x</version>
</dependency>
২. Hibernate কনফিগারেশন
application.properties ফাইলে EhCache সক্রিয় করার জন্য নিম্নলিখিত কনফিগারেশন যোগ করুন:
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.jcache.JCacheRegionFactory
spring.jpa.properties.javax.cache.provider=org.ehcache.jsr107.EhcacheCachingProvider
৩. ehcache.xml ফাইল তৈরি
EhCache এর কনফিগারেশন ফাইল তৈরি করুন:
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.ehcache.org/v3"
xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd">
<cache alias="default">
<expiry>
<ttl unit="seconds">600</ttl>
</expiry>
<heap unit="entries">1000</heap>
</cache>
</config>
৪. Entity ক্লাসে ক্যাশিং সক্রিয় করা
Entity ক্লাসে ক্যাশিং এনাবল করতে @Cache অ্যানোটেশন ব্যবহার করুন:
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Double price;
// Getters and Setters
}
Hibernate-এ Hazelcast Integration
Hazelcast হলো একটি ডিস্ট্রিবিউটেড ইন-মেমোরি ডেটা গ্রিড, যা ক্যাশিং এবং ক্লাস্টারিং সমর্থন করে। এটি Hibernate-এর দ্বিতীয় স্তরের ক্যাশিংয়ের জন্য ব্যবহার করা যেতে পারে।
১. Maven ডিপেনডেন্সি যুক্ত করা
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast-hibernate5</artifactId>
<version>2.x.x</version>
</dependency>
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast</artifactId>
<version>5.x.x</version>
</dependency>
২. Hibernate কনফিগারেশন
application.properties ফাইলে Hazelcast সক্রিয় করার জন্য নিম্নলিখিত কনফিগারেশন যোগ করুন:
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.region.factory_class=com.hazelcast.hibernate.HazelcastCacheRegionFactory
৩. Hazelcast Configuration ফাইল
Hazelcast এর জন্য একটি কনফিগারেশন ফাইল তৈরি করুন:
import com.hazelcast.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class HazelcastConfig {
@Bean
public Config hazelcastConfig() {
Config config = new Config();
config.setInstanceName("hazelcast-instance")
.getMapConfig("default")
.setTimeToLiveSeconds(600);
return config;
}
}
৪. Entity ক্লাসে ক্যাশিং সক্রিয় করা
Entity ক্লাসে ক্যাশিং চালু করতে @Cache ব্যবহার করুন:
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String productName;
private Integer quantity;
// Getters and Setters
}
EhCache এবং Hazelcast এর তুলনা
| বৈশিষ্ট্য | EhCache | Hazelcast |
|---|---|---|
| উপস্থিতি | একক নোড বা ডিস্ট্রিবিউটেড | ডিস্ট্রিবিউটেড (ক্লাস্টার সমর্থন) |
| পারফরম্যান্স | ছোট এবং স্থানীয় ক্যাশের জন্য উপযুক্ত | বড় ও ডিস্ট্রিবিউটেড সিস্টেমে কার্যকর |
| ক্লাস্টারিং সমর্থন | সীমিত বা অতিরিক্ত কনফিগারেশন প্রয়োজন | বিল্ট-ইন ক্লাস্টারিং সমর্থন |
| সহজতা | সহজ এবং হালকা | কনফিগারেশন একটু জটিল |
| ব্যবহারক্ষেত্র | ছোট অ্যাপ্লিকেশন | বড় স্কেল ডিস্ট্রিবিউটেড অ্যাপ্লিকেশন |
সারসংক্ষেপ
Hibernate-এ EhCache এবং Hazelcast এর ইন্টিগ্রেশন ডেটাবেজ অ্যাক্সেস অপটিমাইজ করে এবং অ্যাপ্লিকেশনের পারফরম্যান্স বৃদ্ধি করে।
- EhCache সহজ এবং হালকা ক্যাশিং সল্যুশন, যা একক নোডের জন্য উপযুক্ত।
- Hazelcast একটি শক্তিশালী ডিস্ট্রিবিউটেড ক্যাশিং সিস্টেম, যা বড় স্কেল অ্যাপ্লিকেশনের জন্য আদর্শ।
ব্যবহারক্ষেত্র অনুযায়ী সঠিক ক্যাশিং সমাধান নির্বাচন করলে অ্যাপ্লিকেশনের কার্যক্ষমতা উল্লেখযোগ্যভাবে বৃদ্ধি পায়।
Hibernate Caching একটি গুরুত্বপূর্ণ ফিচার, যা ডাটাবেস অ্যাক্সেস অপ্টিমাইজ করার জন্য ব্যবহৃত হয়। এটি ডেটাবেস থেকে ডেটা পুনরায় রিট্রিভ না করে, মেমোরি থেকে দ্রুত অ্যাক্সেস নিশ্চিত করে। Hibernate Caching ব্যবহার করে অ্যাপ্লিকেশনের পারফরম্যান্স বৃদ্ধি করা যায়।
Hibernate Caching এর প্রকারভেদ
Hibernate দুটি ধরণের ক্যাশিং সাপোর্ট করে:
১. First-Level Cache (Session Cache)
- এটি Hibernate-এর ডিফল্ট ক্যাশিং।
- একক
Session-এর মধ্যে ডেটা ক্যাশ করে রাখে। - Scope: শুধুমাত্র একটি Hibernate Session।
- কনফিগারেশনের প্রয়োজন নেই।
২. Second-Level Cache
- এটি ডিফল্টভাবে নিষ্ক্রিয় থাকে এবং ম্যানুয়ালি কনফিগার করতে হয়।
- একাধিক সেশন জুড়ে ডেটা ক্যাশ করে রাখে।
- Scope: Application-wide।
- Hibernate এর জন্য বিভিন্ন Caching Provider ব্যবহার করা যায়, যেমন:
- Ehcache
- Infinispan
- Redis
- Hazelcast
Hibernate Caching কনফিগারেশন উদাহরণ
১. First-Level Cache উদাহরণ
First-Level Cache স্বয়ংক্রিয়ভাবে Hibernate Session-এ কাজ করে। এখানে কোনো অতিরিক্ত কনফিগারেশন প্রয়োজন নেই।
Session session = sessionFactory.openSession();
// প্রথমবার ডেটা লোড করবে
User user1 = session.get(User.class, 1L);
// একই সেশনে আবার অ্যাক্সেস করলে ডেটাবেসে কোয়েরি হবে না
User user2 = session.get(User.class, 1L);
session.close();
ডিফল্ট বিহেভিয়র: user1 এবং user2 একই অবজেক্ট রেফারেন্স হবে, এবং Hibernate ডেটাবেসে দ্বিতীয়বার কোয়েরি করবে না।
২. Second-Level Cache উদাহরণ (Ehcache)
Second-Level Cache সেটআপ করতে Ehcache ব্যবহার করা যেতে পারে।
Dependency যোগ করুনpom.xml-এ Ehcache-এর জন্য নিচের ডিপেনডেন্সি যোগ করুন:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
</dependency>
Hibernate Configuration (application.properties)
Hibernate Second-Level Cache সক্রিয় করতে নিচের কনফিগারেশন যুক্ত করুন:
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.jcache.JCacheRegionFactory
spring.jpa.properties.javax.cache.provider=org.ehcache.jsr107.EhcacheCachingProvider
Ehcache Configurations (ehcache.xml)
Ehcache ব্যবহারের জন্য ehcache.xml ফাইল তৈরি করুন:
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.ehcache.org/v3"
xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd">
<cache alias="userCache">
<heap unit="entries">100</heap>
<expiry>
<ttl unit="seconds">300</ttl>
</expiry>
</cache>
</config>
Entity ক্লাসে Cache এনোটেশন যোগ করুন
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// Getters and Setters
}
Hibernate Caching ব্যবহার উদাহরণ
কোডে Second-Level Cache টেস্ট করা
// প্রথমবার ডেটা লোড
User user1 = session1.get(User.class, 1L);
session1.close();
// নতুন সেশনে একই ডেটা লোড করলে ক্যাশ থেকে রিট্রিভ হবে
Session session2 = sessionFactory.openSession();
User user2 = session2.get(User.class, 1L);
session2.close();
ক্যাশ বিহেভিয়র:
- প্রথমবার ডেটা ডেটাবেস থেকে লোড হবে।
- দ্বিতীয়বার, অন্য সেশনে একই ডেটা Second-Level Cache থেকে রিট্রিভ হবে।
Hibernate Caching এর সুবিধা
- পারফরম্যান্স উন্নতি: ডেটাবেস থেকে পুনঃপুনঃ ডেটা রিট্রিভ না করে ক্যাশ থেকে দ্রুত অ্যাক্সেস নিশ্চিত করে।
- ডাটাবেস লোড কমানো: কম কোয়েরি চালিয়ে ডাটাবেসে চাপ হ্রাস করে।
- অ্যাপ্লিকেশন স্কেলেবিলিটি বৃদ্ধি: বড় ডেটাসেটের সাথেও উচ্চ পারফরম্যান্স বজায় রাখে।
সতর্কতা এবং সীমাবদ্ধতা
- Second-Level Cache ব্যবহারের সময় ডেটা সিঙ্ক্রোনাইজেশন চ্যালেঞ্জ হতে পারে।
- খুব বড় ডেটা ক্যাশ করলে মেমোরি সমস্যা হতে পারে।
- ক্যাশ ব্যবস্থাপনা সঠিকভাবে কনফিগার না করলে এর সুবিধা হ্রাস পেতে পারে।
Hibernate Caching, বিশেষত Second-Level Cache, ব্যবহার করে স্প্রিং বুট অ্যাপ্লিকেশনের ডেটাবেস অপারেশন দ্রুত এবং কার্যকর করা যায়। Ehcache এর মতো কনফিগারেবল ক্যাশিং সলিউশন ব্যবহার করে পারফরম্যান্স অপ্টিমাইজেশন আরও কার্যকরভাবে করা যায়।
Read more